Hudsonとは

Hudsonとは「継続的インテグレーションサーバー」です。継続的インテグレーションとは

Extreme Programmingに端を発し,Martin Fowlerによって広められた概念で,狭義には,別々に開発された部品を持ち寄ってお互いの動作を検証する「統合テスト」を早い段階から恒常的に行うことを指します。

Hudsonを使ったアジャイルな開発入門 より

原文: Continuous Integration

公式サイトからも説明を引用します。

Hudsonは、ソフトウェアのビルドやcronで起動するジョブなどの繰り返しのジョブの実行を監視します。これらのうち、Hudsonは現在次の2つのジョブに重点を置いています。

  1. 継続的なソフトウェアプロジェクトのビルドとテスト: つまり、CruiseControlやDamageControlが行うこと。 一言で言えば、Hudsonは、容易ないわゆる「継続インテグレーションシステム」を提供し、開発者が変更をプロジェクトに統合でき、ユーザーがより新しいビルドを容易に取得できるようにします。自動化された継続的なビルドは、生産性を向上させます。
  2. 外部で起動するジョブの実行監視: cronによるジョブやprocmailのジョブで、リモートマシンで動作するものも含みます。例えばcronについて言えば、出力をキャプチャーした定期的なメールだけ受信し、こつこつとそれを見ます。おかしくなっていることに気がつくかどうかは、すべてあなた次第です。Hudsonは出力を保存し、 いつおかしくなったのか容易に把握することができるようになります。

PHPの実行にコンパイルは必要ありません。では動的言語のPHPが必要とするビルドとはなんでしょうか?

HudsonはAPIドキュメントの作成やユニットテスト、コード解析ツール、コード重複発見ツールなど開発支援ツールやソフトウエア品質向上のためのソフトウエアを自動実行しレポートにまとめ、CI (継続的インテグレーション) システムとして機能します。

具体的にはレポジトリからソースを取得し、各種テストやソフトウエア品質解析ツールを実行し、その出力をまとめ管理します。

以下の作業がクリック一つあるいは定期的に実行され、その結果や履歴をwebで確認することができます。

  • ユニットテスト
  • テストカバレッジ
  • コード規約チェック
  • 重複コードチェック
  • ドキュメント作成
  • ソフトウエアメトリクス(品質測定)
  • コード分析

※ソフトウエアメトリクスとは?

以下のリンクをご覧ください

またソフトウエアメトリクスには様々な議論があるようです。

Hudsonのインストール

Hudson公式サイト http://hudson-ci.org/ からDownload hudson.warの hudson.warファイルをダウンロードします。

Download hudoson.war

起動
$ java -jar /Applications/hudson.war

http://localhost:8080/ で確認します。こんな画面でHudson先生が出現するはずです。

立ち上げたまま

立ち上げた直後のHudson実行画面

必要なHudsonプラグインのインストール

CI(継続開発)のためのテストや品質測定ツールをインストールします。様々なプラグインがありますが、ここでは以下のHudsonプラグインをインストールします。またそれぞれのプラグインはPHPのライブラリに依存し、別途PEARでのインストールが必要です。

  • xUnit (for processing PHPUnit logfiles in JUnit format)
    ユニットテスト(自動化テスト)

http://www.phpunit.de/manual/3.6/ja/automating-tests.html

  • Clover (for processing PHPUnit code coverage xml output)
    ユニットテストカバレッジツール(ユニットテストがカバーしてる範囲のコードを検出)

http://www.phpunit.de/manual/3.6/ja/code-coverage-analysis.html

  • Checkstyle (for processing PHP_CodeSniffer logfiles in Checkstyle format)
    コーディング規約のチェック

http://pear.php.net/manual/ja/package.php.php-codesniffer.php

  • DRY (for processing phpcpd logfiles in PMD-CPD format)
    重複コードのチェック

https://github.com/sebastianbergmann/phpcpd

  • JDepend (for processing PHP_Depend logfiles in JDepend format)
    メトリクス計測(依存関係や抽象化などのソフトウエアの品質測定)ツール http://pdepend.org/screenshots/full/jdepend.html

  • PMD (for processing phpmd logfiles in PMD format)
    コード分析ツール(バグの可能性や使用されえないコードの検出等)

http://pmd.sourceforge.net/

その他以下のプラグインも結果表示等のためにインストールします。

  • HTML Publisher (for publishing the PHPUnit code coverage report, for instance)
  • Template Project (for using php-hudson-template as a template for Hudson jobs)
  • Violations (for processing various logfiles)

立ち上げたHudoson CIサーバーをから以下のコマンドでインストールします。

$ sudo java -jar hudson-cli.jar -s http://localhost:8080 install-plugin checkstyle dry htmlpublisher jdepend pmd template-project violations xunit clover

Installing checkstyle from update center  
Installing dry from update center  
Installing htmlpublisher from update center  
Installing jdepend from update center  
Installing pmd from update center  
Installing template-project from update center  
Installing violations from update center  
Installing xunit from update center  
Installing clover from update center

PHPのツールのインストール

Hudsonプラグインが必要とする出力する(多くはXML)PHPのツールです。全てPEARパッケージでインストールします。

pear channel-discover pear.pdepend.org
pear channel-discover pear.phpmd.org
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear install pdepend/PHP_Depend-beta
pear install phpmd/PHP_PMD-alpha
pear install phpunit/phpcpd
pear install PHPDocumentor
pear install PHP_CodeSniffer
pear install --alldeps phpunit/PHP_CodeBrowser-alpha
pear install --alldeps phpunit/PHPUnit

build.xml

buildを行うために各ツールの設定等を記したxmlファイル build.xmlを作成します。
https://github.com/sebastianbergmann/php-hudson-template/blob/master/README.markdownのbuild.xmlファイル(sebastianbergmann氏のOject Freezerというパッケージ用のもの)を参考にし自分が対象とするパッケージ用のbuil.xmlを作成します。デフォルトのパスは “リポジトリルート/build.xml” です。

それぞれのツールのマニュアルを参照してbuild.xml内の引数を設定します。

※例えばコード規約の設定をPEARにしたいのならphpcsのセクションを以下のようにします。

 <!-- Generate checkstyle.xml -->
 <target name="phpcs">
  <exec executable="phpcs" output="/dev/null">
   <arg line="--report=checkstyle
              --report-file=${basedir}/build/logs/checkstyle.xml
              --standard=PEAR
              BEAR" />
  </exec>
 </target>

Hudsonでプロジェクト作成

まずphp-hudson-templateというSebastian氏作成のプロジェクトテンプレートをgitで取得します。
これはプロジェクトの設定のひな形です。使用しないで全て手動で設定する事も可能です。

$ cd ~/.hudson/jobs  
$ git clone git://github.com/sebastianbergmann/php-hudson-template.git

php-hudson-templateに掲載されている”Use publishers from another project “の方法では何故かうまくいかなかったので、ひな形をコピーして新規作成。

  • Hudsonをリスタート
  • 「既存ジョブのコピー」でphp-hudson-templateを入力して作成。これができないときは上記のgitでの取得ができていない。
  • “ソースコード管理システム” を指定
  • Ant-based build を設定

それでもphpmdがうまくいかない。antをコマンドラインで実行してみる。

$ cd ~/.hudson/jobs/< プロジェクトフォルダ>/workspace
$ ant phpmd
phpmd:
     [exec] Invalid field modifiers given, allowed modifiers are IS_PUBLIC, IS_PROTECTED, IS_PRIVATE and IS_STATIC.
     [exec] Result: 1

とエラーがでる。
恐らくPEAR等のPHP4コードで修飾子がついてないところで例外が出てるのではと当たりをつけてみる。とりあえず消極的解決法として該当例外をコメントアウト。

/pdepend/PHP/Depend/Code/ASTFieldDeclaration.php
のsetModifiers()メソッド内の例外スローをコメントアウト

if (($expected &#038; $modifiers) !== 0) {
            //throw new InvalidArgumentException(
            //    'Invalid field modifiers given, allowed modifiers are ' .
            //    'IS_PUBLIC, IS_PROTECTED, IS_PRIVATE and IS_STATIC.'
            //);
        }

再度$ ant phpmd

BUILD SUCCESSFUL  
Total time: 1 second

通った。~/.hudson/build/logs/pmd.xmlも作成されている。

build成功

以下はbuild成功した各ツールの結果画面です。

API Document

Code Browser

Code Coverage

PMD警告

重複コード警告

メトリックス1

ユニットテスト

リンク